export default function Class() {
    // class Animal {
    //     move(distanceInMeters: number = 0) {
    //         console.log(`Animal moved ${distanceInMeters}m.`);
    //     }
    // }

    // class Dog extends Animal {
    //     bark() {
    //         console.log('Woof! Woof!');
    //     }
    // }

    // const dog = new Dog();
    // dog.bark();
    // dog.move(10);
    // dog.bark();
    // /**
    //  * 存取器
    //  */
    // let passcode = "secret passcode";

    // class Employee {
    //     private _fullName: string;

    //     get fullName(): string {
    //         return this._fullName;
    //     }

    //     set fullName(newName: string) {
    //         if (passcode && passcode == "secret passcode") {
    //             this._fullName = newName;
    //         }
    //         else {
    //             console.log("Error: Unauthorized update of employee!");
    //         }
    //     }
    // }

    // let employee = new Employee();
    // employee.fullName = "Bob Smith";
    // if (employee.fullName) {
    //     alert(employee.fullName);
    // }
    // let obj = {
    //     x: 1,
    //     y: 2
    // }
    // interface Object {
    //     x: Number
    // }
    // let log: (obj: Object) => void = function (obj) {
    //     obj.x = 2;
    //     console.log(obj)
    // }
    // log(obj);
    // console.log(obj)

    // /**
    //  * 剩余参数
    //  * @param firstName 
    //  * @param otherName 
    //  */
    // function buildName(firstName: string, ...otherName: string[]): string {
    //     return firstName + " " + otherName.join(" ");
    // }
    // let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");
    // console.log(employeeName)

    /**
     * 泛型约束
     */
    // interface Lengthwise {
    //     length: Number
    // }
    // function loggingIdentity<T extends Lengthwise>(arg: T): T {
    //     console.log(arg.length)
    //     return arg;
    // }
    // loggingIdentity([1])
    // let arg: Lengthwise = { length: 10 }
    // loggingIdentity(arg)


    /**
     * 在泛型约束中使用类型参数
     */
    // function getProperty<T, K>(obj: T, key: K) {
    //     return obj[key];
    // }

    // let x = { a: 1, b: 2, c: 3, d: 4 };

    // getProperty(x, "a"); // okay
    // getProperty(x, "m"); // error: Argument of type 'm' isn't assignable to 'a' | 'b' | 'c' | 'd'.

}